Состояние SYN-RECEIVED

Если бит RST установлен, то выполнить следующие действия:

Если данное соединение было инициировано командой пассивного открытия - OPEN (например, был осуществлен переход из состояния LISTEN), то возвратить данное соединение в состояние LISTEN, а управление вернуть прерванной программе. Нет нужды информировать об этом пользователя. Если данное соединение инициируется командой активного открытия OPEN (например, был переход из состояние SYN-SENT), то происходит отказ от этого соединения, а клиенту посылается сообщение "connection refused". В любом случае должны быть удалены все сегменты из очереди на повторную посылку. Кроме того, в случае активного открытия перейти в состояние CLOSED, удалить блок TCB и вернуть управление прерванной программе.

Состояния

         ESTABLISHED
         FIN-WAIT-1
         FIN-WAIT-2
         CLOSE-WAIT

Если установлен бит RST, то все ждущие обработки запросы RECEIVE и SEND должны получить ответ "reset". Убрать все сегменты из очередей. Клиенты должны получить необязательное сообщение общего назначения "connection reset". Перейти в состояние CLOSED, стереть блок TCB и вернуть управление прерванной программе.

Состояния

         CLOSING
         LAST-ACK
         TIME-WAIT

Если выставлен бит RST, то перейти в состояние CLOSED, удалить блок TCB и вернуть управление прерванной программе.

В-третьих, проверить значение безопасности и приоритета у пришедшего сегмента Состояние SYN-RECIEVED.

Если безопасность/закрытость и приоритет в пришедшем сегменте не совпадают с безопасностью/закрытостью и приоритетом, указанными в блоке TCB, то послать сигнал перезагрузки и возвратить управление прерванной программе.

Состояние ESTABLISHED.

Если безопасность/закрытость и приоритет в пришедшем сегменте не совпадают в точности с безопасностью/ закрытостью и приоритетом, указанными в блоке TCB, то послать сигнал перезагрузки, все еще остающиеся необслуженными запросы RECEIVED и SEND должны получить ответ "reset".

Все сегменты из очередей должны быть удалены. Клиенты должны тоже получить необязательный общий сигнал "connection reset". Перейти в состояние CLOSED, удалить блок TCB и вернуть управление прерванной программе.

Заметим, что данная проверка ставится после проверки номера в очереди для того, чтобы предотвратить разрыв данного соединения, инициированный получением сегмента, оставшегося от прежнего соединения с иными безопасностью и приоритетом, существовавшего некогда между данными портами.

В-четвертых, проверить бит SYN.

Состояния

         SYN-RECEIVED
         ESTABLISHED
         FIN-WAIT-1
         FIN-WAIT-2
         CLOSE-WAIT
         CLOSING
         LAST-ACK
         TIME-WAIT

Если SYN находится в пределах окна, то послать сигнал перезагрузки. Любые ждущие обработки команды RECEIVE и SEND должны получить ответ "reset", убрать из очередей все сегменты, а клиент должен получить необязательное общее сообщение "connection reset". Перейти в состояние CLOSED, убрать блок TCB, вернуть управление прерванной программе.

Если SYN находится за пределами окна, то до данного пункта дело не должно дойти. Еще на первом этапе (проверка номера очереди) должно было быть послано подтверждение.

В-пятых, проверить поле ACK.

Если бит ACK не установлен, то сегмент ликвидировать, а управление передать прерванной программе.

Если бит ACK установлен.

Состояние SYN-RECEIVED.

Если SND.UNA =< SEG.ACK =< SND.NXT, то перейти в со стояние ESTABLISHED и продолжить обработку. Если же подтверждение в сегменте оказалось неприемлимым, то сформировать сегмент с сигналом перезагрузки <SEQ=SEG.ACK><CTL=RST> и послать его.

Состояние ESTABLISHED. Если SND.UNA < SEG.ACK =< SND.NXT, то установить в SND.UNA значение из SEG.ACK. Любые сегменты из очереди на повторную посылку, получившие при этом подтверждение, удаляются. Клиенты должны получить положительные отзывы на буферы, которые были посланы командой SEND, а ныне получили полное подтверждение (например, команда послать буфер с данными должна завершиться сообщением "ok"). Если подтверждение является дубликатом (SEG.ACK < SND.UNA), то его можно игнорировать. Если сообщение ACK подтверждает что-либо, еще не отправленное (SEG.ACK > SND.NXT), то послать ACK, ликвидировать сегмент и вернуть управление прерванной программе.

Если SND.UNA < SEG.ACK =< SND.NXT, то следует обновить окно для посылки. Если (SND.WL1 < SEG.SEQ или (SND.WL1 = SEG.SEQ и SND.WL2 =< SEG.ACK)), то установить SND.WND согласно значению SEG.WND, SND.WL1 - в SEG.SEQ, SND.WL2 - в SEG.ACK.

Заметим, что в SND.WND записано смещение относительно SND.UNA, xnj d SND.WL1 записан номер очереди для последнего сегмента, используемого для обновления SND.WND, а также, что в SND.WL2 записан номер подтверждения из последнего сегмента, используемого для обновления SND.WND. При этом проверка охраняет от использования устаревших сегментов для обновления окна.

Состояние FIN-WAIT-1

Все так же как при обработки в случае состояния ESTABLISHED, но если наш сигнал FIN теперь получил подтверждение, то перейти к FIN-WAIT-2 и продолжить обработку в таком состоянии.

Состояние FIN-WAIT-2.

Все так же как при обработке для случая состояния ESTABLISHED, но если очередь повторной посылки пуста, то команда клиента на закрытие соединения CLOSE может получить подтверждение ("ok"), но при этом не удаляет блока TCB.

Состояние CLOSE-WAIT.

Делается та же обработка, что была для случая состояния ESTABLISHED.

Состояние CLOSING

Все так же, как при обработке в случае состояния ESTABLISHED, но если ACK в пришедшем сегменте подтверждает наш сигнал FIN, то перейти в состояние TIME-WAIT. В противном случае сегмент игнорируется.

Состояние LAST-ACK.

Единственная вещь, которая может произойти в этом состоянии - получение подтверждения на сигнал FIN. Если наш сигнал FIN не был подтвержден, то удалить блок TCB, перейти в состояние CLOSED и вернуть управление прерванной программе.

Состояние TIME-WAIT

Единственная вещь, которая может произойти в этом состоянии - это повторная передача чужого сигнала FIN.

Подтвердить сигнал и повторно стартовать по истечении контрольного времени 2MSL.

В-шестых, проверить бит URG.

Состояния

         ESTABLISHED
         FIN-WAIT-1
         FIN-WAIT-2

Если бит URG установлен, то в RCV.UP занести max(RCV.UP, SEG.UP), а также дать знать клиенту, что на другом конце соединения имеются срочные данные, если срочный указатель (RCV.UP) стоит перед данными. Если же клиент уже был оповещен о данной цепочке срочных данных (или если все еще находится в "режиме срочности"), не следует ему напоминать об этом снова.

Состояния

         CLOSE-WAIT
         CLOSING
         LAST-ACK
         TIME-WAIT

Такого не должно произойти, поскольку был получен сигнал FIN с другого конца соединения. Игнорировать бит URG.

В-седьмых, обработать данные их сегмента

Состояния

         ESTABLISHED
         FIN-WAIT-1
         FIN-WAIT-2

Раз мы оказались в состоянии ESTABLISHED, то стало возможным принимать текст для размещения в буферах получения, указанных клиентом. Текст из сегментов может переноситься в буферы до тех пор, пока либо не наполнится соответствующий буфер, либо не станет пустым сегмент. Если сегмент пуст и несет флаг проталкивания PUSH, то при возврате буфера оповестить клиента о том, что был получен сигнал PUSH.

Когда протокол TCP берет на себя ответственность за получение клиентом данных, то он должен также давать подтверждение факта получения этих данных.

Как только программа протокола TCP принимает на себя управление потоком данных, она ставит значение RCV.NXT перед блоком принимаемых данных, а RCV.WND устанавливает соответственно емкости буфера в данный момент. В общем случае значения RCV.NXT и RCV.WND не должны корректироваться в меньшую сторону.

Отметьте, пожалуйста, что управление окном базируется на предположениях, указанных в главе 3.7.

Послать подтверждение в виде <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> Данное подтверждение должно быть добавлено к уходящему на другой конец соединения сегменту и, по возможности, без излишних задержек.

Состояния

         CLOSE-WAIT
         CLOSING
         LAST-ACK
         TIME-WAIT

Такого не должно случаться, поскольку был получен сигнал FIN с другого конца соединения. Игнорировать текст в сегменте.

В-восьмых, проверить бит FIN.

Не обрабатывать сигнала FIN, если состояние CLOSED, LISTEN или SYN-SENT, поскольку нет возможности проверить SEG.SEQ, выкинуть пришедший сегмент и возвратить управление прерванной программе.

Если бит FIN установлен, то дать клиенту сигнал "connection closing", с тем же сообщением завершить все ждущие решения запросы RECEIVED, установить RCV.NXT перед местом в очереди сигнала FIN, послать для последнего подтверждение. Заметим, что сигнал FIN подразумевает проталкивание (PUSH) текстов во всех сегментах, еще не полученных клиентом.

Состояния

         SYN-RECEIVED
         ESTABLISHED

Перейти в состояние CLOSE-WAIT.

Состояние FIN-WAIT-1

Если наш сигнал FIN получил подтверждение (возможно в этом же сегменте), то перейти в состояние TIME-WAIT, запустить контрольный таймер, отключить все иные таймеры.

Если подтверждения не было, перейти в состояние CLOSING.

Состояние FIN-WAIT-2.

Перейти в состояние TIME-WAIT. Запустить контрольный таймер, отключить все контрольные таймеры.

Состояние CLOSE-WAIT.

Остаться в состоянии CLOSE-WAIT.

Состояние CLOSING.

Остаться в состоянии CLOSING.

Состояние LAST-ACK.

Остаться в состоянии LAST-ACK

Состояние TIME-WAIT.

Остаться в состоянии TIME-WAIT. По истечении контрольного времени 2MSL стартовать повторно.

Вернуть управление прерванной программе.

Истечение контрольного времени для клиента

Если истекло контрольного время, то в каком бы состоянии не находилась программа, убрать все очереди, дать клиенту общий сигнал "error: connection aborted due to user timeout", такой же сигнал дать всем ждущим обработки запросам, ликвидировать блок TCB, перейти в состояние CLOSED, вернуть управление прерванной программе.

Истечение контрольного времени для повторной посылки

В каком бы состоянии не находилась программа, если для сегмента в очереди на повторную посылку истекло контрольное время, послать этот сегмент еще раз, но уже вне очереди, произвести вновь инициализацию таймера повторной посылки, вернуть управление прерванной программе.

Истечение контрольного времени для состояния TIME-WAIT

Если истекло контрольное время для состояния TIME-WAIT, то ликвидировать соединение и блок TCB, перейти в состояние CLOSED, вернуть управление прерванной программе.

Hosted by uCoz